<!DOCTYPE html>
<html>
	<head>
		<meta charset="UTF-8">
		<title></title>
	</head>
	<body>
		<img src="../123.jpg" onerror="alert('图片加载错误')" />
	</body>
	<script>
	//1 ：try-catch 
		try{
			//可能出错的代码
			
		}catch(e){
			alert(e);//弹出错误
			alert(e.name);//错误名字  (ie 不支持)
			alert(e.message);//错误信息，浏览器通用
			
		  //	return false;//错线错误返回
		}finally{
			//最后执行
			
		}
		
		
		//2 错误类型
		//error 浏览器错误
		//new Array(-5) >> RangeError(范围错误) invalid array length(无效的数组长度)
		//var box = a  >> ReferenceError(引用错误)  :a is not defind (a 没有定义)
		//a$b >> SyntaxError (语法错误):missing ：before statement(失踪：语句之前)
		
		//new 10 >> TypeError(类型) ：10 is not a constructor(10 不是一个构造函数)
		//其他错误
		
		
		//精确判断
		try{
			
		}catch(e){
			if(e instanceof TypeError){
				alert('类型错误：'+e.message);
			}else if(e instanceof RangeError){
				alert('范围错误：'+e.message);
			}
		}
	
	
	//3善用try-catch
	//常规拼写错误修改代码解决，浏览器兼容建议使用普通if
	//try-catch 消耗更多资源，负担大。
	//抛出错误 throw new Error("未知错误");
	
	//错误事件
/*	window.addEventListener('error',function(){
		alert('发生错误');
	},false)*/
	
	//图片错误
	//<img src="../123.jpg" onerror="alert('图片加载错误')" />
	
	
	
	//4 错误处理策略
	//常见错误类型 1类型转换错误2数据类型错误3通信错误 
	
	
	//相等和全等
	alert(1=='1');//true 相等比较的是值
	alert(1==='1');//false 全等比较值和类型
	
	alert(1==true);//true 1会隐式的转换为布尔值，true==true
	alert(1===true);//false  1本身是数值，true本身是布尔值
	//在类型不相同是使用===；相等比全等速度快
	
	var box =0;
	if(box){     //10会转为true, 0位false  
		alert(box);
	}if(typeof box =='number' ){ // typeof box 返回类型的字符串    'number'也是字符串
		alert(box);//
	}
	
	//字符串
	function getQuerystring(url){
		if(typeof url=='string'){
			var pos =url.indexOf('?');//判断？ 的位置
			return pos;
		}else{
			return '数据类型错误';
		}
	}
	alert(getQuerystring('demo.html?122'));//9
	
	//数组
	function sortArray(arr){
	//	if(typeof arr.sort=='function'){ 
		//只有数组才有sort方法，只要判断sort方法是否存在就可以确定是否为数组
		//但是 null 和模拟方法无法判断而出错
	/*	//ps 如果模拟了sort 方法  可以绕过
		var box ={
		sort:function(){},
		num:5
		}*/
		
		if(arr instanceof Array){//判断必须还是数组
		arr.sort();//排序（只能比较第一位）
		return arr;
		}else{
			return '数据错误';
		}
	
	}
	var box=[1,5,6,45];
	alert(sortArray(box));
	
	
	//5通信错误
	//在使用url 进行参数传递时经常会传递一些中文参数或者url地址，在后台处理时会发生转换乱码或者错误，
	//因为不同浏览器对传递的参数解释是不同的，需要使用编码进行统一传递。
	
	//比如: ?user=张三&age=100;
	var url = '?user='+encodeURIComponent('张三')+'&age=100';//编码
	
	
	
	//6调试
	//1 alert()
	//2 console调试就算不删除程序也照样执行，而alert会阻断后面的代码执行。
	//3将错误抛出
	console.error('错误');
	console.info('信息');
	console.log('日志');
	console.warn('警告');
	
	var num1 =1;
	if(typeof num1 !='number') throw new Error('必须是数字');
	
	
	//调试工具
	
	//网页版本的Firebug:Fire lite(网络必须快)，一段代码谷歌无法使用
	//离线版 引入文件即可（谷歌无法用）
	//谷歌浏览器必须在服务器端有效
	
	//1设置断点2单步调试3监控4控制台
	//debugger 自动设置     
	 
	
	</script>
</html>
